package com.vf.admin.platform.controller;

import com.vf.admin.common.BaseController;
import com.vf.admin.common.Constants;
import com.vf.admin.common.entity.Result;
import com.vf.admin.platform.entity.Element;
import com.vf.admin.platform.entity.Menu;
import com.vf.admin.platform.entity.Organ;
import com.vf.admin.platform.entity.User;
import com.vf.admin.platform.service.ElementService;
import com.vf.admin.platform.service.MenuService;
import com.vf.admin.platform.service.UserService;
import com.vf.admin.utils.RecuUtils;
import com.vf.admin.utils.StringEx;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 平台菜单
 */
@Controller
@RequestMapping(value="/menu")
public class MenuController extends BaseController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    MenuService menuService;
    @Autowired
    UserService userService;
    @Autowired
    ElementService elementService;

    /**
     * 查询菜单列表
     */
    @RequestMapping("/left")
    @ResponseBody
    public Result list(Integer defaultId){
        try{
            Map<String,Object> paraMap = new HashMap<String,Object>();
            List<Menu> list = menuService.findList(paraMap);
            for(Menu menu : list){
                System.out.println(menu.getId()+"  "+menu.getTitle());
            }
            //获取最顶端的菜单
            int maxId = 0;
            if(defaultId!=null && defaultId>0){
                maxId = defaultId;
            }else{
                if(list!=null && list.size()>0){
                    list = list.stream().sorted(Comparator.comparing(Menu::getSorts).reversed()).collect(Collectors.toList());

                    Optional<Menu > organOption = list.stream().min(Comparator.comparingInt(Menu ::getId));
                    Menu menu = organOption.get();
                    maxId = menu.getId();
                }
            }

            Map<String,Object> retMap = new HashMap<String,Object>();
            retMap.put("list",list);
            retMap.put("defaultId",maxId);
            return this.sucessJSON(retMap,"返回成功!");
        }catch(Exception e){
            logger.error("查询菜单列表异常", e);
            return this.errorJSON("操作异常，请联系管理员");
        }
    }

//    /**
//     * 获取所有下级的菜单结构
//     * @return
//     */
//    @RequestMapping("/alllist")
//    @ResponseBody
//    public Result allList(){
//        List<Menu> menuList = new ArrayList<Menu>();
//        try {
//            Map<String,Object> paraMap = new HashMap<String,Object>();
//            List<Menu> list = menuService.findList(paraMap);
//            if(list!=null && list.size()>0){
//                menuList = RecuUtils.getInstance().findMenuList(list,0);
//            }
//            return this.sucess(menuList);
//        } catch (Exception e) {
//            logger.error("查询菜单列表异常", e);
//            e.printStackTrace();
//            return this.error();
//        }
//    }

    /**
     * 获取单个菜单的详情
     * @param id  菜单id
     * @return
     */
    @RequestMapping("/detail")
    public String detail(Integer id){
        try{
            Result result = new Result();
            if(StringEx.isNullOrLing(id)){
                return this.error("主键编号不能为空");
            }
            Menu menu = menuService.get(id);
            if(menu == null){
                return this.error("菜单信息不存在！");
            }

            Map<String,Object> paraMap = new HashMap<String,Object>();
            paraMap.put("menuid",menu.getId());
            List<Element> elementList = elementService.findList(paraMap);
            if(elementList!=null && elementList.size()>0){
                menu.setElementList(elementList);
            }

            Map<Integer,String> shiFouStateMap = Constants.getShiFouStateMap();

            request.setAttribute("shiFouStateMap",shiFouStateMap);
            request.setAttribute("menu",menu);
            return this.sucess("/web/platform/menu/edit");
        }catch(Exception e){
            logger.error("查询菜单详情异常", e);
            return this.error("查询菜单详情异常");
        }
    }


    /**
     * 添加修改菜单
     * @param
//     *           menu  菜单信息
     */
    @RequestMapping("/save")
    @ResponseBody
    public Result saveOrUpdate(Menu menu){
        try{
            if(StringEx.isNull(menu.getTitle())){
                return this.errorJSON("菜单名称不能为空!");
            }
            if(menu.getPid()!=null && menu.getPid().intValue() == -1){
                return this.errorJSON("最高等级菜单不能做修改、删除操作!");
            }
            if(menu.getId()==null || menu.getId()<=0){
                if(menu.getPid()<=0){
                    return this.errorJSON("必须有上级菜单!");
                }
                menu.setStates(menu.getStates() == null ? Constants.shiFou_STATE_FOU : menu.getStates());
                menuService.saveOrUpdate(menu);
                //保存菜单对应的标签URL地址信息
                if(menu.getElementList()!=null && menu.getElementList().size()>0){
                    for(Element element : menu.getElementList()){
                        //添加新的标签数据
                        element.setMenuid(menu.getId());
                        elementService.saveOrUpdate(element);
                    }
                }
            }else{
                Menu menuBf = menuService.get(menu.getId());
                if(menuBf == null){
                    return this.errorJSON("菜单信息不存在!");
                }
                menuBf.setTitle(menu.getTitle());//组织结构名称
                menuBf.setLinks(menu.getLinks());//菜单资源地址
                menuBf.setSorts(menu.getSorts());// 排序值
                menuBf.setStates(menu.getStates() == null ? Constants.shiFou_STATE_FOU : menu.getStates());//状态：1、启用  2、停用
                menuBf.setIcon(menu.getIcon());
                menuBf.setComments(menu.getComments());//备注
                menuService.saveOrUpdate(menuBf);

                //查出老的标签数据
                Map<String,Object> paraMap = new HashMap<String,Object>();
                paraMap.put("menuid",menuBf.getId());
                List<Element> elementList = elementService.findList(paraMap);
                //转换为Map形式
                Map<Integer, Element> elementMap = elementList.stream().collect(Collectors.toMap(Element::getId, (p) -> p));

                //删除老的标签数据
//                elementService.delByMenuId(menuBf.getId());
                //保存菜单对应的标签URL地址信息
                if(menu.getElementList()!=null && menu.getElementList().size()>0){
                    for(Element element : menu.getElementList()){
                        if(element.getId()!=null && element.getId()>0){
                            elementMap.remove(element.getId());
                        }else{
                            //添加新的标签数据
                        }
                        element.setMenuid(menuBf.getId());
                        elementService.saveOrUpdate(element);
                    }

                    //删除已经移除的老的标签数据
                    Iterator<Map.Entry<Integer, Element>> iter = elementMap.entrySet().iterator();
                    while (iter.hasNext()) {
                        Map.Entry<Integer, Element> entry = iter.next();
                        int key = entry.getKey();
                        elementService.del(key);
//                        Map.Entry<Integer, Element> entry = iter.next();
//                        int key = entry.getKey();
//                        if (key % 2 == 1) {
//                            iter.remove();
//                        }
                    }
                }
            }
            return this.sucess();
        }catch(Exception e){
            logger.error("保存更新菜单异常", e);
            return this.errorJSON("保存更新菜单异常!");
        }
    }

    /**
     * 删除菜单
     * @param id   菜单id
     * @return
     */
    @RequestMapping("/del")
    @ResponseBody
    public Result del(Integer id) {
        try {
            if (id==null || id<=0) {
                return this.errorJSON("功能菜单信息不能为空!");
            }
            Menu menu = menuService.get(id);
            if (menu == null || menu.getId()==null || menu.getId()<=0) {
                return this.errorJSON("功能菜单信息不能为空!");
            }

            if (menu.getPid().intValue()== -1) {
                return this.errorJSON("最高等级菜单不能删除操作!");
            }
            Map<String,Object> paraMap = new HashMap<String,Object>();
            paraMap.put("pid",menu.getId());
            List<Menu> menuList = menuService.findList(paraMap);
            if(menuList != null && menuList.size()>0){
                return this.errorJSON("存在下级菜单，不能删除操作!");
            }
             menuService.del(menu.getId());
            return this.sucessJSON("操作成功！");
        } catch (Exception e) {
            logger.error("删除菜单异常", e);
            return this.errorJSON("删除菜单异常!");
        }
    }

}
